Norris led from start to finish to head Carlos Sainz and the brilliant Charles Leclerc who charged from the back row of the grid to third.
Oscar Piastri was 10th after being turned around on the opening lap by Max Verstappen, while Jack Doohan kept his nose clear to see the flag in his first F1 race in 15th.
Liam Lawson was a late retirement when his RB cried enough on the penultimate lap.
An even start from the front row saw Norris lead into the first corner, however a move up the inside for Verstappen nerfed Piastri into a spin and the rear of the pack.
The other Red Bull Racing was in the wars half a lap later when Sergio Perez spun at the chicane at the end of the back straight.
It was a chaotic start that saw Norris leading from Sainz, Pierre Gasly, George Russell, and Nico Hulkenberg at the end of the opening lap.
Leclerc climbed to 12th while Verstappen fell to 11th, Piastri 19th and Perez last, though he didn’t complete the lap before stopping the car.
Doohan survived unscathed though did cut the back chicane to complete the opening lap in 16th.
Perez’s retirement triggered the Virtual Safety Car so officials could clear the stricken Red Bull Racing entry, lasting little more than a lap.
Norris held a strong advantage as racing resumed with Sainz under pressure from Gasly who in turn has Russell all over him.
Piastri had another near miss, nosing into the rear of Franco Colapinto into the chicane, though both were able to continue, but the Argentinian did circle back to the pits.
A lap later, Piastri was in the lane, swapping from the medium rubber onto hards in a 4.4s stop.
For compromising the Australian’s race, Verstappen was pinged with a 10 second penalty for causing a collision.
“Yep, move of a world champion that one,” was Piastri’s take on the clash.
Valtteri Bottas too picked up a penalty, his for turning around Perez in the clash that ultimately ended the Mexican’s race.
It seemed a harsh decision, the adopted-Australian on the apex kerb as the Red Bull Racing driver turned across his front axle. The pair made contact, right-front to left-rear.
Piastri’s race soon got worse when he was slapped with a 10-second penalty for bumping into Colapinto.
While both continued, it had hampered the Williams driver’s race, not to mention Piastri’s, as they took early service.
Leclerc’s early charge saw him rise to sixth by Lap 10, a stunning recovery from the last row of the grid, but still not enough to crown Ferrari champions over McLaren.
On hard tyres and in fresh air, Piastri was lapping at the same pace as his race-leading team-mate as he swapped onto a strategy designed to give him clean track to gain track position.
On Lap 15, Gasly pitted from third, releasing Russell who’d been clamouring over the gearbox of the Alpine without being able to find a way through.
He rejoined behind Doohan, who quickly opened the door and allowed his team-mate through.
By Lap 20, half the field had stopped as Norris continued to lead from Sainz, with Russell third and Leclerc continuing his march forward in fourth.
Gasly was the best placed of those to have stopped in eighth, with those who had pitted filling the bottom half of the timesheets.
Leclerc stopped after 21 laps, feeding out into eighth behind the lead Alpine.
In the other Enstone machine, Doohan boxed on Lap 23 to rejoin in 18th.
It was Lawson’s time next time around, reporting back to his team that “the wheels aren’t on, mate.”
He returned to the box complaining “the car dropped,” the mechanics checking the wheels before sending him back on his way.
Replays showed the front-left had not been correctly fitted, and was loose as he exited the pit lane.
It was heavily penalised by officials, who dished out a 10-second stop-go penalty for Lawson.
Sainz pitted from second after 25 laps, feeding out into third with Norris covering the move a lap later.
The McLaren driver was in a comfortable position, and fed out still in the race lead.
Colapinto’s time in F1, at least for now, came to an end on Lap 28 when he was told to box and retire the car.
Verstappen finally pitted on Lap 29, taking his 10-second penalty for spinning Piastri in a stop that dropped him to 11th.
The Dutchman was far from happy, asking his engineer, “Can we ask for 20 seconds? Stupid idiots.”
Contact between Bottas and Kevin Magnussen at the chicane saw the Haas turned around after his rival locked his brakes and slid into him.
The Sauber driver had been cleared around the outside but misjudged his braking and tagged Magnussen, damaging his front wing and picking up a front-right puncture in the process.
There was damage to the suspension too, and the 10-time grand prix winner’s career came to an end (again, for now) in retirement after 32 laps.
Piastri pitted for the second time on Lap 33, serving his 10-second penalty for contact with Colapinto in the early stages.
Hamilton was in soon after.
Having started on hards, he was able to extend to Lap 34 before switching on to the mediums.
With the field largely washed, Norris held a 2.7s advantage with Leclerc third, 20.3s back from his team-mate after 36 laps.
Then came Russell, Gasly, Hulkenberg, Hamilton, Fernando Alonso, Verstappen, and Alex Albon in the top 10.
Piastri had slipped to 15th with his second stop, and time served by the penalty, while Lawson ran 17th and last following his.
Doohan meanwhile was a solid 13th, running in free air between Yuki Tsunoda ahead and Lance Stroll behind.
Piastri nearly spun into retirement as he caught Tsunoda on Lap 46.
Running 12th at the time, the McLaren driver was on the tail of the RB approaching the hotel section when the back end stepped out.
The Australian needed lightning reactions to save the car, and was soon back on the tail of the Japanese driver.
Two laps later, he was through at the chicane on the back straight, though Tsunoda fought back and used DRS to reclaim the position into the Turn 9 sweeper.
With 10 laps to go, Norris continued to lead by 5.9s over Sainz with Leclerc third.
Piastri cleared Tsunoda on Lap 49, putting a bold move on the RB to go around the outside of Turn 9.
He immediately sprung clear in pursuit of Fernando Alonso ahead, and a potential world championship point.
Behind the leading three, Russell ran in a lonely fourth place, but was being quickly reeled in by Hamilton.
There were tense moments in the Ferrari garage when Sainz, running a comfortable second, reported a suspected puncture, though that was soon dismissed.
With six laps remaining, boxing him would have cost nothing in terms of track position, however it would have seen him lose any hope of beating Norris barring something extraordinary.
Similarly, Ferrari could not pit Leclerc either as Russell remained in his window – the Scuderia powerless to do anything but see out the remaining five and hope circumstances fell their way.
They didn’t and the laps ticked down with Norris in a comfortable position out front, extending his advantage over Sainz and Leclerc to win with ease.
Then came the Mercedes pair, Hamilton having caught Russell in the closing stages to the tune of around a second per lap.
Lawson’s race came to an end on the penultimate lap with his RB smoking, the Kiwi climbed from the car as Norris flashed across the line to hand McLaren its first constructors’ championship in 26 years.
As that was happening, Hamilton cleared Russell to take fourth, then came Verstappen, Gasly, Hulkenberg, Alonso, and Piastri in the final points-paying position.
The Australian was also the final car on the lead lap, offering him the unique stat of completing every lap of every race all season.
The result delivered McLaren its first constructors’ championship in 26 years, taking the title by 14 points over Ferrari.